На этот вопрос уже есть ответы: Нет неявного преобразования в перегруженном операторе (2 ответа) Закрыт 7 лет назад. Я пишу простую оболочку для элементарного типа и стараюсь не писать слишком много разновидностей стандартных операторов. Я надеялся, что неявное преобразование типов поможет, но это не помогло. Вот урезанный пример: struct Int { int _i; Int (int i = 0): _i {i} {} Оператор Int + (const Int & rhs) {return _i + rhs._i;} }; int main (int argc, char * argv []) { (пусто) (Инт (1) + 2); // Отлично (пусто) (2 + Инт (1)); // ошибка: недопустимые операнды для двоичного выражения ('int' и 'Int') } Я использую llvm. Первая строка main компилируется нормально. Второй вызывает ошибку. Я надеялся, что во второй строке произойдет неявное преобразование 2 в Int (2) с последующим вызовом оператора +. Почему этого не происходит? Почему неявное преобразование происходит в первой строке?
2021-03-01 08:20:00
Это происходит в первой строке, потому что единственный доступный оператор + - это оператор + (Int &) (который имеет неявный первый параметр Int для этого экземпляра). Вторая строка терпит неудачу, потому что первый параметр - это int, и он не знает, что ему нужно преобразовать его перед попыткой операции (он не знает, что ему нужно использовать Int :: operator +). Вы можете избежать этой проблемы, сделав оператор функцией друга, не являющейся членом (http://ideone.com/YCf7wX) struct Int { int _i; Int (int i = 0): _i {i} {} друг Int оператор + (const Int & lhs, const Int & rhs); }; Оператор Int + (const Int & lhs, const Int & rhs) { return lhs._i + rhs._i; } int main () { Int i; я + 5; 5 + я; возврат 0; } | Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c ++ operator-keyword implicit-conversion или задайте свой вопрос.